/*
    提供全局接口 && 宏函数，对日志系统接口进行使用便携性优化，用户只需要包含该头文件就可以使用日志功能
*/
#pragma once
#include "logger.hpp"

namespace XKL
{
    // 1. 提供获取指定日志器的全局接口 (避免用户自己操作单例对象)
    Logger::ptr GetLogger(const std::string& name)
    {
        return LoggerManager::GetInstance().GetLogger(name);
    }
    Logger::ptr RootLogger()
    {
        return LoggerManager::GetInstance().RootLogger();
    }
    // 2. 使用宏函数对日志器的接口进行代理 (代理模式)
    #define debug(fmt, ...) debug(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
    #define info(fmt, ...) info(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
    #define warn(fmt, ...) warn(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
    #define error(fmt, ...) error(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
    #define fatal(fmt, ...) fatal(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
    // 3. 提供宏函数，直接进行日志的标准输出打印 (不用获取日志器了) 
    // 下面的宏会被上面的宏进行二次替换
    #define ROOT_DEBUG(fmt, ...) XKL::RootLogger()->debug(fmt, ##__VA_ARGS__)
    #define ROOT_INFO(fmt, ...) XKL::RootLogger()->info(fmt, ##__VA_ARGS__)
    #define ROOT_WARN(fmt, ...) XKL::RootLogger()->warn(fmt, ##__VA_ARGS__)
    #define ROOT_ERROR(fmt, ...) XKL::RootLogger()->error(fmt, ##__VA_ARGS__)
    #define ROOT_FATAL(fmt, ...) XKL::RootLogger()->fatal(fmt, ##__VA_ARGS__)
    // 4. 指定日志器，进行特定业务输出
    #define LOG_DEBUG(logger, fmt, ...) (logger)->debug(fmt, ##__VA_ARGS__)
    #define LOG_INFO(logger, fmt, ...) (logger)->info(fmt, ##__VA_ARGS__)
    #define LOG_WARN(logger, fmt, ...) (logger)->warn(fmt, ##__VA_ARGS__)
    #define LOG_ERROR(logger, fmt, ...) (logger)->error(fmt, ##__VA_ARGS__)
    #define LOG_FATAL(logger, fmt, ...) (logger)->fatal(fmt, ##__VA_ARGS__)
}